package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	//readFileTest2()
	//writeFileTest2()
	//writeFileTest3()
	//writeFileTest4()
	//readWriteFileTest()
	fmt.Println(PathExist("./src/17_file/doc/readTest.txt"))
}

func openFileTest() {
	file, err := os.Open("/home/mint/go-base-learning/src/17_file/doc/readTest.txt")
	fmt.Printf("file=%v, err=%v\n", file, err)
	err = file.Close()
	if err != nil {
		fmt.Println("close file err:", err)
	}
}

func readFileTest() {
	// 打开文件
	file, err := os.Open("/home/mint/go-base-learning/src/17_file/doc/readTest.txt")
	if err != nil {
		fmt.Println("open file err:", err)
		return
	}
	// 函数退出后关闭文件
	defer file.Close()

	// 创建一个*Reader，是带缓冲的，默认缓冲区是4096
	reader := bufio.NewReader(file)
	for {
		str, err := reader.ReadString('\n')
		if err == io.EOF {
			break
		}
		fmt.Print(str)
	}
	fmt.Println("文件读取结束")
}

func readFileTest2() {
	filePath := "./src/17_file/doc/readTest.txt"
	content, err := os.ReadFile(filePath)
	if err != nil {
		fmt.Println("read file err:", err)
	}
	fmt.Println(string(content))
}

func writeFileTest() {
	// 创建一个新文件，写入内容：5句 Hello, World
	// 使用os.OpenFile(), bufio.NewWriter(), *Writer的方法WriteString完成上面的任务
	filePath := "./src/17_file/doc/writeTest.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0777)
	if err != nil {
		fmt.Println("open file err:", err)
		return
	}
	defer file.Close()
	str := "Hello, World\n"
	writer := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		writer.WriteString(str)
	}
	// 因为writer是带缓存的，因此在调用WriteString的时候，是先写入缓存的
	// 所以需要调用Flush方法，将缓冲的数据真正写入到文件中，否则文件中会没有数据
	writer.Flush()
}

func writeFileTest2() {
	// 打开一个存在的文件，将原来的内容覆盖为10句“你好，世界！”
	// 使用os.OpenFile(), bufio.NewWriter(), *Writer的方法WriteString完成上面的任务
	filePath := "./src/17_file/doc/writeTest.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_TRUNC, 0777)
	if err != nil {
		fmt.Println("open file err:", err)
		return
	}
	defer file.Close()
	str := "你好，世界！\n"
	writer := bufio.NewWriter(file)
	for i := 0; i < 10; i++ {
		writer.WriteString(str)
	}
	// 因为writer是带缓存的，因此在调用WriteString的时候，是先写入缓存的
	// 所以需要调用Flush方法，将缓冲的数据真正写入到文件中，否则文件中会没有数据
	writer.Flush()
}

func writeFileTest3() {
	// 打开一个存在的文件，将原来的内容追加内容“ABC!ENGLISH!”
	// 使用os.OpenFile(), bufio.NewWriter(), *Writer的方法WriteString完成上面的任务
	filePath := "./src/17_file/doc/writeTest.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_APPEND, 0777)
	if err != nil {
		fmt.Println("open file err:", err)
		return
	}
	defer file.Close()
	str := "ABC!ENGLISH!\n"
	writer := bufio.NewWriter(file)
	writer.WriteString(str)
	// 因为writer是带缓存的，因此在调用WriteString的时候，是先写入缓存的
	// 所以需要调用Flush方法，将缓冲的数据真正写入到文件中，否则文件中会没有数据
	writer.Flush()
}

func writeFileTest4() {
	// 打开一个存在的文件，将原来的内容读出并显示在终端，并追加“Hello, 北京！”
	// 使用os.OpenFile(), bufio.NewWriter(), *Writer的方法WriteString完成上面的任务
	filePath := "./src/17_file/doc/writeTest.txt"
	file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0777)
	if err != nil {
		fmt.Println("open file err:", err)
		return
	}
	defer file.Close()
	reader := bufio.NewReader(file)
	for {
		str, err := reader.ReadString('\n')
		fmt.Print(str)
		if err == io.EOF {
			break
		}
	}
	str := "Hello, 北京！\n"
	writer := bufio.NewWriter(file)
	writer.WriteString(str)
	// 因为writer是带缓存的，因此在调用WriteString的时候，是先写入缓存的
	// 所以需要调用Flush方法，将缓冲的数据真正写入到文件中，否则文件中会没有数据
	writer.Flush()
}

func readWriteFileTest() {
	// 将一个文件的内容写入到另一个文件，注：两个文件都以存在
	// 使用ioutil.ReadFile/ioutil.WriteFile完成
	// 1. 将writeTest.txt 内容读取到内存
	// 2. 将读到的内容写入 writeTest2.txt
	filePath1 := "./src/17_file/doc/writeTest.txt"
	filePath2 := "./src/17_file/doc/writeTest2.txt"
	data, err := os.ReadFile(filePath1)
	if err != nil {
		fmt.Println("read file err:", err)
		return
	}
	err = os.WriteFile(filePath2, data, 0777)
	if err != nil {
		fmt.Println("write file err:", err)
	}
}

func PathExist(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	} else if os.IsNotExist(err) {
		return false, nil
	} else {
		return false, err
	}
}
